﻿using System;
using KuiHuaBaoDian.Services.Battle.Data;
using KuiHuaBaoDian.Services.Battle.Entity;

namespace KuiHuaBaoDian.Services.Battle {

    /// <summary>
    /// 战斗Buff提供者
    /// </summary>
    public interface IBattleBuffProvider : IDisposable {

        IBattleBuffProviderSetter AsSetter();

        /// <summary>
        /// 拥有者实例ID
        /// </summary>
        BattleEntityInstanceID OwnerEntityInstanceID { get; }

        /// <summary>
        /// 实例ID
        /// </summary>
        BattleEntityInstanceID EntityInstanceID { get; }

        IReadOnlyBattleData HPBase { get; }

        IReadOnlyBattleData HPFactor { get; }

        IReadOnlyBattleData HPAdditional { get; }

        IReadOnlyBattleData HPMaxBase { get; }

        IReadOnlyBattleData HPMaxFactor { get; }

        IReadOnlyBattleData HPMaxAdditional { get; }

        IReadOnlyBattleData DamageHPMaxBase { get; }

        IReadOnlyBattleData DamageHPMaxFactor { get; }

        IReadOnlyBattleData DamageHPMaxAdditional { get; }

        IReadOnlyBattleData DamageHPBase { get; }

        IReadOnlyBattleData DamageHPFactor { get; }

        IReadOnlyBattleData DamageHPAdditional { get; }

        IReadOnlyBattleData DamageBase { get; }

        IReadOnlyBattleData DamageFactor { get; }

        IReadOnlyBattleData DamageAdditional { get; }

        IReadOnlyBattleData AttackBase { get; }

        IReadOnlyBattleData AttackFactor { get; }

        IReadOnlyBattleData AttackAdditional { get; }

        IReadOnlyBattleData AttackBossAdditionalBase { get; }

        IReadOnlyBattleData AttackBossAdditionalFactor { get; }

        IReadOnlyBattleData AttackBossAdditionalAdditional { get; }

        IReadOnlyBattleData AttackSpeedBase { get; }

        IReadOnlyBattleData AttackSpeedFactor { get; }

        IReadOnlyBattleData AttackSpeedAdditional { get; }

        IReadOnlyBattleData CriticalBase { get; }

        IReadOnlyBattleData CriticalFactor { get; }

        IReadOnlyBattleData CriticalAdditional { get; }

        IReadOnlyBattleData CriticalPowerBase { get; }

        IReadOnlyBattleData CriticalPowerFactor { get; }

        IReadOnlyBattleData CriticalPowerAdditional { get; }

        IReadOnlyBattleData SpottingRangeBase { get; }

        IReadOnlyBattleData SpottingRangeFactor { get; }

        IReadOnlyBattleData SpottingRangeAdditional { get; }

        IReadOnlyBattleData MoveSpeedBase { get; }

        IReadOnlyBattleData MoveSpeedFactor { get; }

        IReadOnlyBattleData MoveSpeedAdditional { get; }

        IReadOnlyBattleData DefenseBase { get; }

        IReadOnlyBattleData DefenseFactor { get; }

        IReadOnlyBattleData DefenseAdditional { get; }

        IReadOnlyBattleData DodgeBase { get; }

        IReadOnlyBattleData DodgeFactor { get; }

        IReadOnlyBattleData DodgeAdditional { get; }

        IReadOnlyBattleData InfluenceAmountAdditional { get; }
    }

    public interface IBattleBuffProviderSetter : IBattleBuffProvider {

        /// <summary>
        /// 添加Buff
        /// </summary>
        /// <param name="source">来源</param>
        void AttachBuff(IBattleBuffProvider source);

        /// <summary>
        /// 移除Buff
        /// </summary>
        /// <param name="source">来源</param>
        void DetachBuff(IBattleBuffProvider source);
    }
}
